import pygame
from pygame.locals import *
import time,random


class HeroPlane:
	'''玩家飞机(定义玩家英雄类)'''

	def __init__(self,screen_temp):
		'''scrrn_temp 是窗口对象'''
		self.x = 200
		self.y = 400
		'''定义坐标位置'''
		self.screen = screen_temp
		'''定义屏幕窗口对象'''
		self.image = pygame.image.load("./images/e1.png")
		'''定义玩家图像'''
		self.bullet_list = []
		'''子弹由飞机发射，就定义一个子弹夹【空列表】（bullte——list）#玩家的子弹列表'''

	def display(self):
		'''绘制玩家飞机（用display输出）'''
		for b in self.bullet_list:
			'''绘制子弹'''
			b.display()
			'''子弹绘制方法'''
			if b.move():
				'''定义子弹移动操作'''

				self.bullet_list.remove(b)
				'''3.如果返回真的话，执行这个操作。self.bullet_list.remove(b)【remove.删除操作】'''
			
		self.screen.blit(self.image,(self.x,self.y))
		'''获取当前窗口对象，绘制飞机，在，x，y 上绘制，每次绘制调用display，记得在主函数循环里调用'''

		
	def move_left(self):
		'''左移动飞机'''
		self.x -= 5
		if self.x <= 0:
			'''防越界，以0位原点'''
			self.x = 0


	def move_right(self):
		'''玩家飞机右移动'''
		self.x += 5
		if self.x >= 406:
			'''右边用图多大减去飞机的大小等于定位多少'''
			self.x = 406
			'''用上面减完的值定义飞机右边防越界'''
	def fire(self):
		self.bullet_list.append(Bullet(self.screen,self.x,self.y))
		'''在列表【list】传参数用 append,将子弹实例化'''
		#print(len(self.bullet_list))
		'''不停往列表里append（放子弹），就查查长度，便于做优化 用子弹做判断，进行优化。。move'''
	def heroDied(self,enemy):
		for bb in enemy.bullet_list:
			if bb.x>self.x+12 and bb.x<self.x+90 and bb.y>self.y+20 and bb.y<self.y+60:
				enemy.bullet_lsit.remove(bb)
				return True
			


class Bullet:
	'''子弹类(定义玩家英雄类)'''

	def __init__(self,screen_temp,x,y):
		'''scrrn_temp 是窗口对象,定义的时候需要传 x轴，y轴'''
		self.x = x+49
		self.y = y
		'''定义坐标位置'''
		self.screen = screen_temp
		'''定义屏幕窗口对象'''
		self.image = pygame.image.load("./images/pd.png")
		'''定义玩家图像'''

	def display(self):
		'''绘制子弹（用display输出）''' 
		self.screen.blit(self.image,(self.x,self.y))
		'''获取当前窗口对象，绘制飞机，在，x，y 上绘制，每次绘制调用display，记得在主函数循环里调用'''
	def move(self):
		'''子弹移动'''
		self.y -=10
		'''子弹向上移动，就定义y轴，y-=10是移动速度设置'''
		if self.y <=-20:
			'''子弹长度为17的话，如果子弹高于屏幕20，就返回一个。真。（return True）把这个真交给 move移动者做如果判断3'''
			return True

	


class EnemyPlane:
	'''敌机类(定义敌机英雄类)'''

	def __init__(self,screen_temp):
		'''给这个scrrn_temp 窗口对象就可以,定义的时候 不 需要传 x轴，y轴'''
		self.x = random.choice(range(408))
		'''0~408 随机数值，要导入一个随机的 import random,408指0~407的值'''
		self.y = -75
		'''定义坐标，由于敌机向下移动，让他在屏幕外显示，数值要大于图画的最高值（-80<-75）'''
		self.screen = screen_temp
		'''定义屏幕窗口对象'''
		self.image = pygame.image.load("./images/e2.png")
		'''定义玩家图像'''
		self.bullet_list = []

	def display(self):
		'''绘制敌机（用display输出）'''
		'''绘制子弹'''
		for eb in self.bullet_list:
			eb.display()
			if eb.move():
				self.bullet_list.remove(eb)
		self.screen.blit(self.image,(self.x,self.y))


		'''获取当前窗口对象，绘制飞机，在，x，y 上绘制，每次绘制调用display，记得在主函数循环里调用'''
	def move(self,hero):
		'''子弹移动'''
		self.y += 4
		'''子弹向上移动，就定义y轴，y-=10是移动速度设置'''



		#敌机出屏幕操作
		if self.y>568:
			return True

		#遍历玩家子弹，并执行碰撞检测
		for bo in hero.bullet_list:
			if bo.x>self.x+12 and bo.x<self.x+92 and bo.y>self.y+20 and bo.y<self.y+60:
				hero.bullet_list.remove(bo)
				return True
	def fire(self):
		self.bullet_list.append(EnemyBullet(self.screen,self.x,self.y))


class EnemyBullet:
	'''子弹类(定义玩家英雄类)'''

	def __init__(self,screen_temp,x,y):
		'''scrrn_temp 是窗口对象,定义的时候需要传 x轴，y轴'''
		self.x = x+52
		self.y = y+74
		'''定义坐标位置'''
		self.screen = screen_temp
		'''定义屏幕窗口对象'''
		self.image = pygame.image.load("./images/enemy_bullet.png")
		'''定义玩家图像'''

	def display(self):
		'''绘制子弹（用display输出）'''
		self.screen.blit(self.image,(self.x,self.y))
		'''获取当前窗口对象，绘制飞机，在，x，y 上绘制，每次绘制调用display，记得在主函数循环里调用'''
	def move(self):
		'''子弹移动'''
		self.y +=10

		if self.y > 570:
			return True


		
		

		

			

	

	
	
	
		
		
		
def key_control(hero_temp):
	'''键盘控制函数'''
	'''执行退出操作'''
	for event in pygame.event.get():
		if event.type == QUIT:
			print("exit()")
			exit()

	pressed_keys = pygame.key.get_pressed()
	#print(pressed_keys)
	if pressed_keys[K_LEFT] or pressed_keys[K_a]:
		print("left...")
		hero_temp.move_left()
		'''调用左侧移动'''

	elif pressed_keys[K_RIGHT] or pressed_keys[K_d]:
		print("right...")
		hero_temp.move_right()

	if pressed_keys[K_SPACE]:
		print("space...")
		hero_temp.fire()
		'''在键盘函数里使用。就定义一个发射方法（hero_temp.fire），这样就要在玩家里定义一个发射的方法1'''
def boom(screen,x,y):
    for i in range(1,5):
        boom = pygame.image.load('./images/boom'+str(i)+'.png')
        screen.blit(boom, (x, y))


def main():

	screen = pygame.display.set_mode((512,568),0,0)

	background = pygame.image.load("./images/bg2.jpg")

	hero = HeroPlane(screen)
	'''创建玩家飞机'''

	m = -968

	enemylist = []#定一个存放敌机的列表


	while True:
		screen.blit(background,(0,m))

		m+=2
		if m >= -200:
			m = -968


		#绘制玩家飞机
		hero.display()
		

		key_control(hero)
		'''执行键盘控制'''


		#随机绘制敌机
		if random.choice(range(50))==10:
			'''随机什么值放一个敌机进屏幕里，要定一个变量enmeylist'''
			b = EnemyPlane(screen)
			enemylist.append(b)
			b.fire()
		for em in enemylist:
			'''遍历敌机并绘制敌机移动，更新'''
			#x循环绘制移动和更新
			em.display()
			#传入子弹所有参数

			if em.move(hero):
				enemylist.remove(em)#敌机消除操作
				boom(screen, em.x, em.y)



		

		pygame.display.update()
		'''执行更新显示'''

		time.sleep(0.04)
		'''定时显示'''




'''判断当前是否主运行程勋，并调用'''
if __name__ == "__main__":
	main()